
package structure;

import java.io.Serializable;

/**
 * Représente une coordonné de cellule.
 * 
 * @author David Bernard
 * @since java 1.6
 * @see AbstractDataCenter
 */
public class DataKey implements Serializable, Comparable<DataKey>
{
	/**
	 * Est la valeur maximum pour une ligne.
	 */
	public static final int LIGNE_MAX = 0x0000FFFF;

	/**
	 * Est le valeur maximum pour une colonne.
	 */
	public static final int COLONNE_MAX = 0x0000FFFF;

	private int ligne = 0;
	private int col = 0;

	/**
	 * Instancie une clé à la coordonné 0,0.
	 */
	public DataKey()
	{
		this(0, 0);
	}

	/**
	 * Instancie une clé aux coordonné spécifé en paramètres.
	 * 
	 * @param ligne int, la ligne cible.
	 * @param col int, la colonne cible.
	 */
	public DataKey(int ligne, int col)
	{
		this.setAddress(ligne, col);
	}

	/**
	 * Setter de l'adresse de la clé.
	 * 
	 * @param ligne int, la ligne cible.
	 * @param col int, la colonne cible.
	 */
	public void setAddress(int ligne, int col)
	{
		this.ligne = ligne;
		this.col = col;
	}

	/**
	 * Getter de la ligne.
	 * 
	 * @return int, la ligne de la clé.
	 */
	public int getLigne()
	{
		return this.ligne;
	}

	/**
	 * Getter de la colonne.
	 * 
	 * @return int, la colonne de la clé.
	 */
	public int getColonne()
	{
		return this.col;
	}

	/**
	 * Crée une copie de la clé.
	 * 
	 * @return DataKey, une copie de la clé.
	 */
	public DataKey createKey()
	{
		return new DataKey(this.ligne, this.col);
	}

	/**
	 * @author Nicolas Roseberry
	 * @author David Bernard
	 */
	@Override
	public int hashCode()
	{
		int ligne = this.ligne;
		int col = this.col;
		int hash = 0;

		if (ligne <= DataKey.LIGNE_MAX && col <= DataKey.COLONNE_MAX)
		{
			ligne <<= 0x10;
			hash = ligne | col;
		}
		else
		{
			throw new RuntimeException("valeur hors limite");
		}

		return hash;
	}

	@Override
	public boolean equals(Object o)
	{
		boolean out;
		if (o == null || !(o instanceof DataKey))
		{
			out = false;
		}
		else
		{
			DataKey node = (DataKey) o;
			out = this.col == node.col && this.ligne == node.ligne;
		}

		return out;
	}

	@Override
	public String toString()
	{
		return "[" + this.ligne + ", " + this.getColonne() + "] 0x"
				+ Integer.toHexString(this.hashCode()).toUpperCase();
	}

	@Override
	public int compareTo(DataKey key)
	{
		int out = 0;

		if (this.ligne == key.ligne)
		{
			if (this.col == key.col)
			{
				out = 0;
			}
			else if (this.col > key.col)
			{
				out = 1;
			}
			else if (this.col < key.col)
			{
				out = -1;
			}
		}
		else if (this.ligne > key.ligne)
		{
			out = 1;
		}
		else if (this.ligne < key.ligne)
		{
			out = -1;
		}

		return out;
	}
}
